home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / pkg_resources.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2008-10-13  |  56.8 KB  |  2,061 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import sys
  5. import os
  6. import zipimport
  7. import time
  8. import re
  9. import imp
  10. import new
  11. import pkgutil
  12.  
  13. try:
  14.     frozenset
  15. except NameError:
  16.     from sets import ImmutableSet as frozenset
  17.  
  18. from os import utime, rename, unlink
  19. from os import open as os_open
  20.  
  21. def get_supported_platform():
  22.     plat = get_build_platform()
  23.     m = macosVersionString.match(plat)
  24.     if m is not None and sys.platform == 'darwin':
  25.         
  26.         try:
  27.             plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3))
  28.         except ValueError:
  29.             pass
  30.         except:
  31.             None<EXCEPTION MATCH>ValueError
  32.         
  33.  
  34.     None<EXCEPTION MATCH>ValueError
  35.     return plat
  36.  
  37. __all__ = [
  38.     'require',
  39.     'run_script',
  40.     'get_provider',
  41.     'get_distribution',
  42.     'load_entry_point',
  43.     'get_entry_map',
  44.     'get_entry_info',
  45.     'iter_entry_points',
  46.     'resource_string',
  47.     'resource_stream',
  48.     'resource_filename',
  49.     'resource_listdir',
  50.     'resource_exists',
  51.     'resource_isdir',
  52.     'declare_namespace',
  53.     'working_set',
  54.     'add_activation_listener',
  55.     'find_distributions',
  56.     'set_extraction_path',
  57.     'cleanup_resources',
  58.     'get_default_cache',
  59.     'Environment',
  60.     'WorkingSet',
  61.     'ResourceManager',
  62.     'Distribution',
  63.     'Requirement',
  64.     'EntryPoint',
  65.     'ResolutionError',
  66.     'VersionConflict',
  67.     'DistributionNotFound',
  68.     'UnknownExtra',
  69.     'ExtractionError',
  70.     'parse_requirements',
  71.     'parse_version',
  72.     'safe_name',
  73.     'safe_version',
  74.     'get_platform',
  75.     'compatible_platforms',
  76.     'yield_lines',
  77.     'split_sections',
  78.     'safe_extra',
  79.     'to_filename',
  80.     'ensure_directory',
  81.     'normalize_path',
  82.     'EGG_DIST',
  83.     'BINARY_DIST',
  84.     'SOURCE_DIST',
  85.     'CHECKOUT_DIST',
  86.     'DEVELOP_DIST',
  87.     'IMetadataProvider',
  88.     'IResourceProvider',
  89.     'FileMetadata',
  90.     'PathMetadata',
  91.     'EggMetadata',
  92.     'EmptyProvider',
  93.     'empty_provider',
  94.     'NullProvider',
  95.     'EggProvider',
  96.     'DefaultProvider',
  97.     'ZipProvider',
  98.     'register_finder',
  99.     'register_namespace_handler',
  100.     'register_loader_type',
  101.     'fixup_namespace_packages',
  102.     'get_importer',
  103.     'run_main',
  104.     'AvailableDistributions']
  105.  
  106. class ResolutionError(Exception):
  107.     
  108.     def __repr__(self):
  109.         return self.__class__.__name__ + repr(self.args)
  110.  
  111.  
  112.  
  113. class VersionConflict(ResolutionError):
  114.     pass
  115.  
  116.  
  117. class DistributionNotFound(ResolutionError):
  118.     pass
  119.  
  120.  
  121. class UnknownExtra(ResolutionError):
  122.     pass
  123.  
  124. _provider_factories = { }
  125. PY_MAJOR = sys.version[:3]
  126. EGG_DIST = 3
  127. BINARY_DIST = 2
  128. SOURCE_DIST = 1
  129. CHECKOUT_DIST = 0
  130. DEVELOP_DIST = -1
  131.  
  132. def register_loader_type(loader_type, provider_factory):
  133.     _provider_factories[loader_type] = provider_factory
  134.  
  135.  
  136. def get_provider(moduleOrReq):
  137.     if isinstance(moduleOrReq, Requirement):
  138.         if not working_set.find(moduleOrReq):
  139.             pass
  140.         return require(str(moduleOrReq))[0]
  141.     
  142.     
  143.     try:
  144.         module = sys.modules[moduleOrReq]
  145.     except KeyError:
  146.         __import__(moduleOrReq)
  147.         module = sys.modules[moduleOrReq]
  148.  
  149.     loader = getattr(module, '__loader__', None)
  150.     return _find_adapter(_provider_factories, loader)(module)
  151.  
  152.  
  153. def _macosx_vers(_cache = []):
  154.     if not _cache:
  155.         info = os.popen('/usr/bin/sw_vers').read().splitlines()
  156.         for line in info:
  157.             (key, value) = line.split(None, 1)
  158.             if key == 'ProductVersion:':
  159.                 _cache.append(value.strip().split('.'))
  160.                 break
  161.                 continue
  162.         else:
  163.             raise ValueError, 'What?!'
  164.     
  165.     return _cache[0]
  166.  
  167.  
  168. def _macosx_arch(machine):
  169.     return {
  170.         'PowerPC': 'ppc',
  171.         'Power_Macintosh': 'ppc' }.get(machine, machine)
  172.  
  173.  
  174. def get_build_platform():
  175.     get_platform = get_platform
  176.     import distutils.util
  177.     plat = get_platform()
  178.     if sys.platform == 'darwin' and not plat.startswith('macosx-'):
  179.         
  180.         try:
  181.             version = _macosx_vers()
  182.             machine = os.uname()[4].replace(' ', '_')
  183.             return 'macosx-%d.%d-%s' % (int(version[0]), int(version[1]), _macosx_arch(machine))
  184.         except ValueError:
  185.             pass
  186.         except:
  187.             None<EXCEPTION MATCH>ValueError
  188.         
  189.  
  190.     None<EXCEPTION MATCH>ValueError
  191.     return plat
  192.  
  193. macosVersionString = re.compile('macosx-(\\d+)\\.(\\d+)-(.*)')
  194. darwinVersionString = re.compile('darwin-(\\d+)\\.(\\d+)\\.(\\d+)-(.*)')
  195. get_platform = get_build_platform
  196.  
  197. def compatible_platforms(provided, required):
  198.     if provided is None and required is None or provided == required:
  199.         return True
  200.     
  201.     reqMac = macosVersionString.match(required)
  202.     if reqMac:
  203.         provMac = macosVersionString.match(provided)
  204.         if not provMac:
  205.             provDarwin = darwinVersionString.match(provided)
  206.             if provDarwin:
  207.                 dversion = int(provDarwin.group(1))
  208.                 macosversion = '%s.%s' % (reqMac.group(1), reqMac.group(2))
  209.                 if (dversion == 7 or macosversion >= '10.3' or dversion == 8) and macosversion >= '10.4':
  210.                     return True
  211.                 
  212.             
  213.             return False
  214.         
  215.         if provMac.group(1) != reqMac.group(1) or provMac.group(3) != reqMac.group(3):
  216.             return False
  217.         
  218.         if int(provMac.group(2)) > int(reqMac.group(2)):
  219.             return False
  220.         
  221.         return True
  222.     
  223.     return False
  224.  
  225.  
  226. def run_script(dist_spec, script_name):
  227.     ns = sys._getframe(1).f_globals
  228.     name = ns['__name__']
  229.     ns.clear()
  230.     ns['__name__'] = name
  231.     require(dist_spec)[0].run_script(script_name, ns)
  232.  
  233. run_main = run_script
  234.  
  235. def get_distribution(dist):
  236.     if isinstance(dist, basestring):
  237.         dist = Requirement.parse(dist)
  238.     
  239.     if isinstance(dist, Requirement):
  240.         dist = get_provider(dist)
  241.     
  242.     if not isinstance(dist, Distribution):
  243.         raise TypeError('Expected string, Requirement, or Distribution', dist)
  244.     
  245.     return dist
  246.  
  247.  
  248. def load_entry_point(dist, group, name):
  249.     return get_distribution(dist).load_entry_point(group, name)
  250.  
  251.  
  252. def get_entry_map(dist, group = None):
  253.     return get_distribution(dist).get_entry_map(group)
  254.  
  255.  
  256. def get_entry_info(dist, group, name):
  257.     return get_distribution(dist).get_entry_info(group, name)
  258.  
  259.  
  260. try:
  261.     from pkgutil import get_importer
  262. except ImportError:
  263.     import _pkgutil as pkgutil
  264.     get_importer = pkgutil.get_importer
  265.  
  266. import pkgutil
  267.  
  268. class IMetadataProvider:
  269.     
  270.     def has_metadata(name):
  271.         pass
  272.  
  273.     
  274.     def get_metadata(name):
  275.         pass
  276.  
  277.     
  278.     def get_metadata_lines(name):
  279.         pass
  280.  
  281.     
  282.     def metadata_isdir(name):
  283.         pass
  284.  
  285.     
  286.     def metadata_listdir(name):
  287.         pass
  288.  
  289.     
  290.     def run_script(script_name, namespace):
  291.         pass
  292.  
  293.  
  294.  
  295. class IResourceProvider(IMetadataProvider):
  296.     
  297.     def get_resource_filename(manager, resource_name):
  298.         pass
  299.  
  300.     
  301.     def get_resource_stream(manager, resource_name):
  302.         pass
  303.  
  304.     
  305.     def get_resource_string(manager, resource_name):
  306.         pass
  307.  
  308.     
  309.     def has_resource(resource_name):
  310.         pass
  311.  
  312.     
  313.     def resource_isdir(resource_name):
  314.         pass
  315.  
  316.     
  317.     def resource_listdir(resource_name):
  318.         pass
  319.  
  320.  
  321.  
  322. class WorkingSet(object):
  323.     
  324.     def __init__(self, entries = None):
  325.         self.entries = []
  326.         self.entry_keys = { }
  327.         self.by_key = { }
  328.         self.callbacks = []
  329.         if entries is None:
  330.             entries = sys.path
  331.         
  332.         for entry in entries:
  333.             self.add_entry(entry)
  334.         
  335.  
  336.     
  337.     def add_entry(self, entry):
  338.         self.entry_keys.setdefault(entry, [])
  339.         self.entries.append(entry)
  340.         for dist in find_distributions(entry, True):
  341.             self.add(dist, entry, False)
  342.         
  343.  
  344.     
  345.     def __contains__(self, dist):
  346.         return self.by_key.get(dist.key) == dist
  347.  
  348.     
  349.     def find(self, req):
  350.         dist = self.by_key.get(req.key)
  351.         if dist is not None and dist not in req:
  352.             raise VersionConflict(dist, req)
  353.         else:
  354.             return dist
  355.  
  356.     
  357.     def iter_entry_points(self, group, name = None):
  358.         for dist in self:
  359.             entries = dist.get_entry_map(group)
  360.             if name is None:
  361.                 for ep in entries.values():
  362.                     yield ep
  363.                 
  364.             if name in entries:
  365.                 yield entries[name]
  366.                 continue
  367.         
  368.  
  369.     
  370.     def run_script(self, requires, script_name):
  371.         ns = sys._getframe(1).f_globals
  372.         name = ns['__name__']
  373.         ns.clear()
  374.         ns['__name__'] = name
  375.         self.require(requires)[0].run_script(script_name, ns)
  376.  
  377.     
  378.     def __iter__(self):
  379.         seen = { }
  380.         for item in self.entries:
  381.             for key in self.entry_keys[item]:
  382.                 if key not in seen:
  383.                     seen[key] = 1
  384.                     yield self.by_key[key]
  385.                     continue
  386.             
  387.         
  388.  
  389.     
  390.     def add(self, dist, entry = None, insert = True):
  391.         if insert:
  392.             dist.insert_on(self.entries, entry)
  393.         
  394.         if entry is None:
  395.             entry = dist.location
  396.         
  397.         keys = self.entry_keys.setdefault(entry, [])
  398.         keys2 = self.entry_keys.setdefault(dist.location, [])
  399.         if dist.key in self.by_key:
  400.             return None
  401.         
  402.         self.by_key[dist.key] = dist
  403.         if dist.key not in keys:
  404.             keys.append(dist.key)
  405.         
  406.         if dist.key not in keys2:
  407.             keys2.append(dist.key)
  408.         
  409.         self._added_new(dist)
  410.  
  411.     
  412.     def resolve(self, requirements, env = None, installer = None):
  413.         requirements = list(requirements)[::-1]
  414.         processed = { }
  415.         best = { }
  416.         to_activate = []
  417.         while requirements:
  418.             req = requirements.pop(0)
  419.             if req in processed:
  420.                 continue
  421.             
  422.             dist = best.get(req.key)
  423.             if dist is None:
  424.                 dist = self.by_key.get(req.key)
  425.                 if dist is None:
  426.                     if env is None:
  427.                         env = Environment(self.entries)
  428.                     
  429.                     dist = best[req.key] = env.best_match(req, self, installer)
  430.                     if dist is None:
  431.                         raise DistributionNotFound(req)
  432.                     
  433.                 
  434.                 to_activate.append(dist)
  435.             
  436.             if dist not in req:
  437.                 raise VersionConflict(dist, req)
  438.             
  439.             requirements.extend(dist.requires(req.extras)[::-1])
  440.             processed[req] = True
  441.         return to_activate
  442.  
  443.     
  444.     def find_plugins(self, plugin_env, full_env = None, installer = None, fallback = True):
  445.         plugin_projects = list(plugin_env)
  446.         plugin_projects.sort()
  447.         error_info = { }
  448.         distributions = { }
  449.         if full_env is None:
  450.             env = Environment(self.entries)
  451.             env += plugin_env
  452.         else:
  453.             env = full_env + plugin_env
  454.         shadow_set = self.__class__([])
  455.         map(shadow_set.add, self)
  456.         for project_name in plugin_projects:
  457.             for dist in plugin_env[project_name]:
  458.                 req = [
  459.                     dist.as_requirement()]
  460.                 
  461.                 try:
  462.                     resolvees = shadow_set.resolve(req, env, installer)
  463.                 except ResolutionError:
  464.                     v = None
  465.                     error_info[dist] = v
  466.                     if fallback:
  467.                         continue
  468.                     else:
  469.                         break
  470.                     fallback
  471.  
  472.                 map(shadow_set.add, resolvees)
  473.                 distributions.update(dict.fromkeys(resolvees))
  474.             
  475.         
  476.         distributions = list(distributions)
  477.         distributions.sort()
  478.         return (distributions, error_info)
  479.  
  480.     
  481.     def require(self, *requirements):
  482.         needed = self.resolve(parse_requirements(requirements))
  483.         for dist in needed:
  484.             self.add(dist)
  485.         
  486.         return needed
  487.  
  488.     
  489.     def subscribe(self, callback):
  490.         if callback in self.callbacks:
  491.             return None
  492.         
  493.         self.callbacks.append(callback)
  494.         for dist in self:
  495.             callback(dist)
  496.         
  497.  
  498.     
  499.     def _added_new(self, dist):
  500.         for callback in self.callbacks:
  501.             callback(dist)
  502.         
  503.  
  504.  
  505.  
  506. class Environment(object):
  507.     
  508.     def __init__(self, search_path = None, platform = get_supported_platform(), python = PY_MAJOR):
  509.         self._distmap = { }
  510.         self._cache = { }
  511.         self.platform = platform
  512.         self.python = python
  513.         self.scan(search_path)
  514.  
  515.     
  516.     def can_add(self, dist):
  517.         if self.python is None and dist.py_version is None or dist.py_version == self.python:
  518.             pass
  519.         return compatible_platforms(dist.platform, self.platform)
  520.  
  521.     
  522.     def remove(self, dist):
  523.         self._distmap[dist.key].remove(dist)
  524.  
  525.     
  526.     def scan(self, search_path = None):
  527.         if search_path is None:
  528.             search_path = sys.path
  529.         
  530.         for item in search_path:
  531.             for dist in find_distributions(item):
  532.                 self.add(dist)
  533.             
  534.         
  535.  
  536.     
  537.     def __getitem__(self, project_name):
  538.         
  539.         try:
  540.             return self._cache[project_name]
  541.         except KeyError:
  542.             project_name = project_name.lower()
  543.             if project_name not in self._distmap:
  544.                 return []
  545.             
  546.         except:
  547.             project_name not in self._distmap
  548.  
  549.         if project_name not in self._cache:
  550.             dists = self._cache[project_name] = self._distmap[project_name]
  551.             _sort_dists(dists)
  552.         
  553.         return self._cache[project_name]
  554.  
  555.     
  556.     def add(self, dist):
  557.         if self.can_add(dist) and dist.has_version():
  558.             dists = self._distmap.setdefault(dist.key, [])
  559.             if dist not in dists:
  560.                 dists.append(dist)
  561.                 if dist.key in self._cache:
  562.                     _sort_dists(self._cache[dist.key])
  563.                 
  564.             
  565.         
  566.  
  567.     
  568.     def best_match(self, req, working_set, installer = None):
  569.         dist = working_set.find(req)
  570.         if dist is not None:
  571.             return dist
  572.         
  573.         for dist in self[req.key]:
  574.             if dist in req:
  575.                 return dist
  576.                 continue
  577.         
  578.         return self.obtain(req, installer)
  579.  
  580.     
  581.     def obtain(self, requirement, installer = None):
  582.         if installer is not None:
  583.             return installer(requirement)
  584.         
  585.  
  586.     
  587.     def __iter__(self):
  588.         for key in self._distmap.keys():
  589.             if self[key]:
  590.                 yield key
  591.                 continue
  592.         
  593.  
  594.     
  595.     def __iadd__(self, other):
  596.         if isinstance(other, Distribution):
  597.             self.add(other)
  598.         elif isinstance(other, Environment):
  599.             for project in other:
  600.                 for dist in other[project]:
  601.                     self.add(dist)
  602.                 
  603.             
  604.         else:
  605.             raise TypeError("Can't add %r to environment" % (other,))
  606.         return self
  607.  
  608.     
  609.     def __add__(self, other):
  610.         new = self.__class__([], platform = None, python = None)
  611.         for env in (self, other):
  612.             new += env
  613.         
  614.         return new
  615.  
  616.  
  617. AvailableDistributions = Environment
  618.  
  619. class ExtractionError(RuntimeError):
  620.     pass
  621.  
  622.  
  623. class ResourceManager:
  624.     extraction_path = None
  625.     
  626.     def __init__(self):
  627.         self.cached_files = { }
  628.  
  629.     
  630.     def resource_exists(self, package_or_requirement, resource_name):
  631.         return get_provider(package_or_requirement).has_resource(resource_name)
  632.  
  633.     
  634.     def resource_isdir(self, package_or_requirement, resource_name):
  635.         return get_provider(package_or_requirement).resource_isdir(resource_name)
  636.  
  637.     
  638.     def resource_filename(self, package_or_requirement, resource_name):
  639.         return get_provider(package_or_requirement).get_resource_filename(self, resource_name)
  640.  
  641.     
  642.     def resource_stream(self, package_or_requirement, resource_name):
  643.         return get_provider(package_or_requirement).get_resource_stream(self, resource_name)
  644.  
  645.     
  646.     def resource_string(self, package_or_requirement, resource_name):
  647.         return get_provider(package_or_requirement).get_resource_string(self, resource_name)
  648.  
  649.     
  650.     def resource_listdir(self, package_or_requirement, resource_name):
  651.         return get_provider(package_or_requirement).resource_listdir(resource_name)
  652.  
  653.     
  654.     def extraction_error(self):
  655.         old_exc = sys.exc_info()[1]
  656.         if not self.extraction_path:
  657.             pass
  658.         cache_path = get_default_cache()
  659.         err = ExtractionError("Can't extract file(s) to egg cache\n\nThe following error occurred while trying to extract file(s) to the Python egg\ncache:\n\n  %s\n\nThe Python egg cache directory is currently set to:\n\n  %s\n\nPerhaps your account does not have write access to this directory?  You can\nchange the cache directory by setting the PYTHON_EGG_CACHE environment\nvariable to point to an accessible directory.\n" % (old_exc, cache_path))
  660.         err.manager = self
  661.         err.cache_path = cache_path
  662.         err.original_error = old_exc
  663.         raise err
  664.  
  665.     
  666.     def get_cache_path(self, archive_name, names = ()):
  667.         if not self.extraction_path:
  668.             pass
  669.         extract_path = get_default_cache()
  670.         target_path = os.path.join(extract_path, archive_name + '-tmp', *names)
  671.         
  672.         try:
  673.             ensure_directory(target_path)
  674.         except:
  675.             self.extraction_error()
  676.  
  677.         self.cached_files[target_path] = 1
  678.         return target_path
  679.  
  680.     
  681.     def postprocess(self, tempname, filename):
  682.         if os.name == 'posix':
  683.             mode = (os.stat(tempname).st_mode | 365) & 4095
  684.             os.chmod(tempname, mode)
  685.         
  686.  
  687.     
  688.     def set_extraction_path(self, path):
  689.         if self.cached_files:
  690.             raise ValueError("Can't change extraction path, files already extracted")
  691.         
  692.         self.extraction_path = path
  693.  
  694.     
  695.     def cleanup_resources(self, force = False):
  696.         pass
  697.  
  698.  
  699.  
  700. def get_default_cache():
  701.     
  702.     try:
  703.         return os.environ['PYTHON_EGG_CACHE']
  704.     except KeyError:
  705.         pass
  706.  
  707.     if os.name != 'nt':
  708.         return os.path.expanduser('~/.python-eggs')
  709.     
  710.     app_data = 'Application Data'
  711.     app_homes = [
  712.         (('APPDATA',), None),
  713.         (('USERPROFILE',), app_data),
  714.         (('HOMEDRIVE', 'HOMEPATH'), app_data),
  715.         (('HOMEPATH',), app_data),
  716.         (('HOME',), None),
  717.         (('WINDIR',), app_data)]
  718.     for keys, subdir in app_homes:
  719.         dirname = ''
  720.         for key in keys:
  721.             if key in os.environ:
  722.                 dirname = os.path.join(dirname, os.environ[key])
  723.                 continue
  724.         elif subdir:
  725.             dirname = os.path.join(dirname, subdir)
  726.         
  727.         return os.path.join(dirname, 'Python-Eggs')
  728.     else:
  729.         raise RuntimeError('Please set the PYTHON_EGG_CACHE enviroment variable')
  730.  
  731.  
  732. def safe_name(name):
  733.     return re.sub('[^A-Za-z0-9.]+', '-', name)
  734.  
  735.  
  736. def safe_version(version):
  737.     version = version.replace(' ', '.')
  738.     return re.sub('[^A-Za-z0-9.]+', '-', version)
  739.  
  740.  
  741. def safe_extra(extra):
  742.     return re.sub('[^A-Za-z0-9.]+', '_', extra).lower()
  743.  
  744.  
  745. def to_filename(name):
  746.     return name.replace('-', '_')
  747.  
  748.  
  749. class NullProvider:
  750.     egg_name = None
  751.     egg_info = None
  752.     loader = None
  753.     
  754.     def __init__(self, module):
  755.         self.loader = getattr(module, '__loader__', None)
  756.         self.module_path = os.path.dirname(getattr(module, '__file__', ''))
  757.  
  758.     
  759.     def get_resource_filename(self, manager, resource_name):
  760.         return self._fn(self.module_path, resource_name)
  761.  
  762.     
  763.     def get_resource_stream(self, manager, resource_name):
  764.         return StringIO(self.get_resource_string(manager, resource_name))
  765.  
  766.     
  767.     def get_resource_string(self, manager, resource_name):
  768.         return self._get(self._fn(self.module_path, resource_name))
  769.  
  770.     
  771.     def has_resource(self, resource_name):
  772.         return self._has(self._fn(self.module_path, resource_name))
  773.  
  774.     
  775.     def has_metadata(self, name):
  776.         if self.egg_info:
  777.             pass
  778.         return self._has(self._fn(self.egg_info, name))
  779.  
  780.     
  781.     def get_metadata(self, name):
  782.         if not self.egg_info:
  783.             return ''
  784.         
  785.         return self._get(self._fn(self.egg_info, name))
  786.  
  787.     
  788.     def get_metadata_lines(self, name):
  789.         return yield_lines(self.get_metadata(name))
  790.  
  791.     
  792.     def resource_isdir(self, resource_name):
  793.         return self._isdir(self._fn(self.module_path, resource_name))
  794.  
  795.     
  796.     def metadata_isdir(self, name):
  797.         if self.egg_info:
  798.             pass
  799.         return self._isdir(self._fn(self.egg_info, name))
  800.  
  801.     
  802.     def resource_listdir(self, resource_name):
  803.         return self._listdir(self._fn(self.module_path, resource_name))
  804.  
  805.     
  806.     def metadata_listdir(self, name):
  807.         if self.egg_info:
  808.             return self._listdir(self._fn(self.egg_info, name))
  809.         
  810.         return []
  811.  
  812.     
  813.     def run_script(self, script_name, namespace):
  814.         script = 'scripts/' + script_name
  815.         if not self.has_metadata(script):
  816.             raise ResolutionError('No script named %r' % script_name)
  817.         
  818.         script_text = self.get_metadata(script).replace('\r\n', '\n')
  819.         script_text = script_text.replace('\r', '\n')
  820.         script_filename = self._fn(self.egg_info, script)
  821.         namespace['__file__'] = script_filename
  822.         if os.path.exists(script_filename):
  823.             execfile(script_filename, namespace, namespace)
  824.         else:
  825.             cache = cache
  826.             import linecache
  827.             cache[script_filename] = (len(script_text), 0, script_text.split('\n'), script_filename)
  828.             script_code = compile(script_text, script_filename, 'exec')
  829.             exec script_code in namespace, namespace
  830.  
  831.     
  832.     def _has(self, path):
  833.         raise NotImplementedError("Can't perform this operation for unregistered loader type")
  834.  
  835.     
  836.     def _isdir(self, path):
  837.         raise NotImplementedError("Can't perform this operation for unregistered loader type")
  838.  
  839.     
  840.     def _listdir(self, path):
  841.         raise NotImplementedError("Can't perform this operation for unregistered loader type")
  842.  
  843.     
  844.     def _fn(self, base, resource_name):
  845.         if resource_name:
  846.             return os.path.join(base, *resource_name.split('/'))
  847.         
  848.         return base
  849.  
  850.     
  851.     def _get(self, path):
  852.         if hasattr(self.loader, 'get_data'):
  853.             return self.loader.get_data(path)
  854.         
  855.         raise NotImplementedError("Can't perform this operation for loaders without 'get_data()'")
  856.  
  857.  
  858. register_loader_type(object, NullProvider)
  859.  
  860. class EggProvider(NullProvider):
  861.     
  862.     def __init__(self, module):
  863.         NullProvider.__init__(self, module)
  864.         self._setup_prefix()
  865.  
  866.     
  867.     def _setup_prefix(self):
  868.         path = self.module_path
  869.         old = None
  870.         while path != old:
  871.             if path.lower().endswith('.egg'):
  872.                 self.egg_name = os.path.basename(path)
  873.                 self.egg_info = os.path.join(path, 'EGG-INFO')
  874.                 self.egg_root = path
  875.                 break
  876.             
  877.             old = path
  878.             (path, base) = os.path.split(path)
  879.  
  880.  
  881.  
  882. class DefaultProvider(EggProvider):
  883.     
  884.     def _has(self, path):
  885.         return os.path.exists(path)
  886.  
  887.     
  888.     def _isdir(self, path):
  889.         return os.path.isdir(path)
  890.  
  891.     
  892.     def _listdir(self, path):
  893.         return os.listdir(path)
  894.  
  895.     
  896.     def get_resource_stream(self, manager, resource_name):
  897.         return open(self._fn(self.module_path, resource_name), 'rb')
  898.  
  899.     
  900.     def _get(self, path):
  901.         stream = open(path, 'rb')
  902.         
  903.         try:
  904.             return stream.read()
  905.         finally:
  906.             stream.close()
  907.  
  908.  
  909.  
  910. register_loader_type(type(None), DefaultProvider)
  911.  
  912. class EmptyProvider(NullProvider):
  913.     _isdir = _has = (lambda self, path: False)
  914.     
  915.     _get = lambda self, path: ''
  916.     
  917.     _listdir = lambda self, path: []
  918.     module_path = None
  919.     
  920.     def __init__(self):
  921.         pass
  922.  
  923.  
  924. empty_provider = EmptyProvider()
  925.  
  926. class ZipProvider(EggProvider):
  927.     eagers = None
  928.     
  929.     def __init__(self, module):
  930.         EggProvider.__init__(self, module)
  931.         self.zipinfo = zipimport._zip_directory_cache[self.loader.archive]
  932.         self.zip_pre = self.loader.archive + os.sep
  933.  
  934.     
  935.     def _zipinfo_name(self, fspath):
  936.         if fspath.startswith(self.zip_pre):
  937.             return fspath[len(self.zip_pre):]
  938.         
  939.         raise AssertionError('%s is not a subpath of %s' % (fspath, self.zip_pre))
  940.  
  941.     
  942.     def _parts(self, zip_path):
  943.         fspath = self.zip_pre + zip_path
  944.         if fspath.startswith(self.egg_root + os.sep):
  945.             return fspath[len(self.egg_root) + 1:].split(os.sep)
  946.         
  947.         raise AssertionError('%s is not a subpath of %s' % (fspath, self.egg_root))
  948.  
  949.     
  950.     def get_resource_filename(self, manager, resource_name):
  951.         if not self.egg_name:
  952.             raise NotImplementedError('resource_filename() only supported for .egg, not .zip')
  953.         
  954.         zip_path = self._resource_to_zip(resource_name)
  955.         eagers = self._get_eager_resources()
  956.         if '/'.join(self._parts(zip_path)) in eagers:
  957.             for name in eagers:
  958.                 self._extract_resource(manager, self._eager_to_zip(name))
  959.             
  960.         
  961.         return self._extract_resource(manager, zip_path)
  962.  
  963.     
  964.     def _extract_resource(self, manager, zip_path):
  965.         if zip_path in self._index():
  966.             for name in self._index()[zip_path]:
  967.                 last = self._extract_resource(manager, os.path.join(zip_path, name))
  968.             
  969.             return os.path.dirname(last)
  970.         
  971.         zip_stat = self.zipinfo[zip_path]
  972.         t = zip_stat[5]
  973.         d = zip_stat[6]
  974.         size = zip_stat[3]
  975.         date_time = ((d >> 9) + 1980, d >> 5 & 15, d & 31, (t & 65535) >> 11, t >> 5 & 63, (t & 31) * 2, 0, 0, -1)
  976.         timestamp = time.mktime(date_time)
  977.         
  978.         try:
  979.             real_path = manager.get_cache_path(self.egg_name, self._parts(zip_path))
  980.             if os.path.isfile(real_path):
  981.                 stat = os.stat(real_path)
  982.                 if stat.st_size == size and stat.st_mtime == timestamp:
  983.                     return real_path
  984.                 
  985.             
  986.             (outf, tmpnam) = _mkstemp('.$extract', dir = os.path.dirname(real_path))
  987.             os.write(outf, self.loader.get_data(zip_path))
  988.             os.close(outf)
  989.             utime(tmpnam, (timestamp, timestamp))
  990.             manager.postprocess(tmpnam, real_path)
  991.             
  992.             try:
  993.                 rename(tmpnam, real_path)
  994.             except os.error:
  995.                 if os.path.isfile(real_path):
  996.                     stat = os.stat(real_path)
  997.                     if stat.st_size == size and stat.st_mtime == timestamp:
  998.                         return real_path
  999.                     elif os.name == 'nt':
  1000.                         unlink(real_path)
  1001.                         rename(tmpnam, real_path)
  1002.                         return real_path
  1003.                     
  1004.                 
  1005.                 raise 
  1006.  
  1007.         except os.error:
  1008.             manager.extraction_error()
  1009.  
  1010.         return real_path
  1011.  
  1012.     
  1013.     def _get_eager_resources(self):
  1014.         if self.eagers is None:
  1015.             eagers = []
  1016.             for name in ('native_libs.txt', 'eager_resources.txt'):
  1017.                 if self.has_metadata(name):
  1018.                     eagers.extend(self.get_metadata_lines(name))
  1019.                     continue
  1020.             
  1021.             self.eagers = eagers
  1022.         
  1023.         return self.eagers
  1024.  
  1025.     
  1026.     def _index(self):
  1027.         
  1028.         try:
  1029.             return self._dirindex
  1030.         except AttributeError:
  1031.             ind = { }
  1032.             for path in self.zipinfo:
  1033.                 parts = path.split(os.sep)
  1034.                 while parts:
  1035.                     parent = os.sep.join(parts[:-1])
  1036.                     if parent in ind:
  1037.                         ind[parent].append(parts[-1])
  1038.                         break
  1039.                         continue
  1040.                     ind[parent] = [
  1041.                         parts.pop()]
  1042.             
  1043.             self._dirindex = ind
  1044.             return ind
  1045.  
  1046.  
  1047.     
  1048.     def _has(self, fspath):
  1049.         zip_path = self._zipinfo_name(fspath)
  1050.         if not zip_path in self.zipinfo:
  1051.             pass
  1052.         return zip_path in self._index()
  1053.  
  1054.     
  1055.     def _isdir(self, fspath):
  1056.         return self._zipinfo_name(fspath) in self._index()
  1057.  
  1058.     
  1059.     def _listdir(self, fspath):
  1060.         return list(self._index().get(self._zipinfo_name(fspath), ()))
  1061.  
  1062.     
  1063.     def _eager_to_zip(self, resource_name):
  1064.         return self._zipinfo_name(self._fn(self.egg_root, resource_name))
  1065.  
  1066.     
  1067.     def _resource_to_zip(self, resource_name):
  1068.         return self._zipinfo_name(self._fn(self.module_path, resource_name))
  1069.  
  1070.  
  1071. register_loader_type(zipimport.zipimporter, ZipProvider)
  1072.  
  1073. class FileMetadata(EmptyProvider):
  1074.     
  1075.     def __init__(self, path):
  1076.         self.path = path
  1077.  
  1078.     
  1079.     def has_metadata(self, name):
  1080.         return name == 'PKG-INFO'
  1081.  
  1082.     
  1083.     def get_metadata(self, name):
  1084.         if name == 'PKG-INFO':
  1085.             return open(self.path, 'rU').read()
  1086.         
  1087.         raise KeyError('No metadata except PKG-INFO is available')
  1088.  
  1089.     
  1090.     def get_metadata_lines(self, name):
  1091.         return yield_lines(self.get_metadata(name))
  1092.  
  1093.  
  1094.  
  1095. class PathMetadata(DefaultProvider):
  1096.     
  1097.     def __init__(self, path, egg_info):
  1098.         self.module_path = path
  1099.         self.egg_info = egg_info
  1100.  
  1101.  
  1102.  
  1103. class EggMetadata(ZipProvider):
  1104.     
  1105.     def __init__(self, importer):
  1106.         self.zipinfo = zipimport._zip_directory_cache[importer.archive]
  1107.         self.zip_pre = importer.archive + os.sep
  1108.         self.loader = importer
  1109.         if importer.prefix:
  1110.             self.module_path = os.path.join(importer.archive, importer.prefix)
  1111.         else:
  1112.             self.module_path = importer.archive
  1113.         self._setup_prefix()
  1114.  
  1115.  
  1116. _distribution_finders = { }
  1117.  
  1118. def register_finder(importer_type, distribution_finder):
  1119.     _distribution_finders[importer_type] = distribution_finder
  1120.  
  1121.  
  1122. def find_distributions(path_item, only = False):
  1123.     importer = get_importer(path_item)
  1124.     finder = _find_adapter(_distribution_finders, importer)
  1125.     return finder(importer, path_item, only)
  1126.  
  1127.  
  1128. def find_in_zip(importer, path_item, only = False):
  1129.     metadata = EggMetadata(importer)
  1130.     if metadata.has_metadata('PKG-INFO'):
  1131.         yield Distribution.from_filename(path_item, metadata = metadata)
  1132.     
  1133.     if only:
  1134.         return None
  1135.     
  1136.     for subitem in metadata.resource_listdir('/'):
  1137.         if subitem.endswith('.egg'):
  1138.             subpath = os.path.join(path_item, subitem)
  1139.             for dist in find_in_zip(zipimport.zipimporter(subpath), subpath):
  1140.                 yield dist
  1141.             
  1142.     
  1143.  
  1144. register_finder(zipimport.zipimporter, find_in_zip)
  1145.  
  1146. def StringIO(*args, **kw):
  1147.     global StringIO, StringIO
  1148.     
  1149.     try:
  1150.         StringIO = StringIO
  1151.         import cStringIO
  1152.     except ImportError:
  1153.         StringIO = StringIO
  1154.         import StringIO
  1155.  
  1156.     return StringIO(*args, **kw)
  1157.  
  1158.  
  1159. def find_nothing(importer, path_item, only = False):
  1160.     return ()
  1161.  
  1162. register_finder(object, find_nothing)
  1163.  
  1164. def find_on_path(importer, path_item, only = False):
  1165.     path_item = _normalize_cached(path_item)
  1166.     if os.path.isdir(path_item):
  1167.         if path_item.lower().endswith('.egg'):
  1168.             yield Distribution.from_filename(path_item, metadata = PathMetadata(path_item, os.path.join(path_item, 'EGG-INFO')))
  1169.         else:
  1170.             for entry in os.listdir(path_item):
  1171.                 lower = entry.lower()
  1172.                 if lower.endswith('.egg-info'):
  1173.                     fullpath = os.path.join(path_item, entry)
  1174.                     if os.path.isdir(fullpath):
  1175.                         metadata = PathMetadata(path_item, fullpath)
  1176.                     else:
  1177.                         metadata = FileMetadata(fullpath)
  1178.                     yield Distribution.from_location(path_item, entry, metadata, precedence = DEVELOP_DIST)
  1179.                     continue
  1180.                 if not only and lower.endswith('.egg'):
  1181.                     for dist in find_distributions(os.path.join(path_item, entry)):
  1182.                         yield dist
  1183.                     
  1184.                 if not only and lower.endswith('.egg-link'):
  1185.                     for line in file(os.path.join(path_item, entry)):
  1186.                         if not line.strip():
  1187.                             continue
  1188.                         
  1189.                         for item in find_distributions(os.path.join(path_item, line.rstrip())):
  1190.                             yield item
  1191.                         
  1192.                     
  1193.             
  1194.     
  1195.  
  1196. register_finder(pkgutil.ImpImporter, find_on_path)
  1197. _namespace_handlers = { }
  1198. _namespace_packages = { }
  1199.  
  1200. def register_namespace_handler(importer_type, namespace_handler):
  1201.     _namespace_handlers[importer_type] = namespace_handler
  1202.  
  1203.  
  1204. def _handle_ns(packageName, path_item):
  1205.     importer = get_importer(path_item)
  1206.     if importer is None:
  1207.         return None
  1208.     
  1209.     loader = importer.find_module(packageName)
  1210.     if loader is None:
  1211.         return None
  1212.     
  1213.     module = sys.modules.get(packageName)
  1214.     if module is None:
  1215.         module = sys.modules[packageName] = new.module(packageName)
  1216.         module.__path__ = []
  1217.         _set_parent_ns(packageName)
  1218.     elif not hasattr(module, '__path__'):
  1219.         raise TypeError('Not a package:', packageName)
  1220.     
  1221.     handler = _find_adapter(_namespace_handlers, importer)
  1222.     subpath = handler(importer, path_item, packageName, module)
  1223.     if subpath is not None:
  1224.         path = module.__path__
  1225.         path.append(subpath)
  1226.         loader.load_module(packageName)
  1227.         module.__path__ = path
  1228.     
  1229.     return subpath
  1230.  
  1231.  
  1232. def declare_namespace(packageName):
  1233.     imp.acquire_lock()
  1234.     
  1235.     try:
  1236.         if packageName in _namespace_packages:
  1237.             return None
  1238.         
  1239.         path = sys.path
  1240.         parent = None
  1241.         if '.' in packageName:
  1242.             parent = '.'.join(packageName.split('.')[:-1])
  1243.             declare_namespace(parent)
  1244.             __import__(parent)
  1245.             
  1246.             try:
  1247.                 path = sys.modules[parent].__path__
  1248.             except AttributeError:
  1249.                 raise TypeError('Not a package:', parent)
  1250.             except:
  1251.                 None<EXCEPTION MATCH>AttributeError
  1252.             
  1253.  
  1254.         None<EXCEPTION MATCH>AttributeError
  1255.         _namespace_packages.setdefault(parent, []).append(packageName)
  1256.         _namespace_packages.setdefault(packageName, [])
  1257.         for path_item in path:
  1258.             _handle_ns(packageName, path_item)
  1259.     finally:
  1260.         imp.release_lock()
  1261.  
  1262.  
  1263.  
  1264. def fixup_namespace_packages(path_item, parent = None):
  1265.     imp.acquire_lock()
  1266.     
  1267.     try:
  1268.         for package in _namespace_packages.get(parent, ()):
  1269.             subpath = _handle_ns(package, path_item)
  1270.             if subpath:
  1271.                 fixup_namespace_packages(subpath, package)
  1272.                 continue
  1273.     finally:
  1274.         imp.release_lock()
  1275.  
  1276.  
  1277.  
  1278. def file_ns_handler(importer, path_item, packageName, module):
  1279.     subpath = os.path.join(path_item, packageName.split('.')[-1])
  1280.     normalized = _normalize_cached(subpath)
  1281.     for item in module.__path__:
  1282.         if _normalize_cached(item) == normalized:
  1283.             break
  1284.             continue
  1285.     else:
  1286.         return subpath
  1287.  
  1288. register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
  1289. register_namespace_handler(zipimport.zipimporter, file_ns_handler)
  1290.  
  1291. def null_ns_handler(importer, path_item, packageName, module):
  1292.     pass
  1293.  
  1294. register_namespace_handler(object, null_ns_handler)
  1295.  
  1296. def normalize_path(filename):
  1297.     return os.path.normcase(os.path.realpath(filename))
  1298.  
  1299.  
  1300. def _normalize_cached(filename, _cache = { }):
  1301.     
  1302.     try:
  1303.         return _cache[filename]
  1304.     except KeyError:
  1305.         _cache[filename] = result = normalize_path(filename)
  1306.         return result
  1307.  
  1308.  
  1309.  
  1310. def _set_parent_ns(packageName):
  1311.     parts = packageName.split('.')
  1312.     name = parts.pop()
  1313.     if parts:
  1314.         parent = '.'.join(parts)
  1315.         setattr(sys.modules[parent], name, sys.modules[packageName])
  1316.     
  1317.  
  1318.  
  1319. def yield_lines(strs):
  1320.     if isinstance(strs, basestring):
  1321.         for s in strs.splitlines():
  1322.             s = s.strip()
  1323.             if s and not s.startswith('#'):
  1324.                 yield s
  1325.                 continue
  1326.         
  1327.     else:
  1328.         for ss in strs:
  1329.             for s in yield_lines(ss):
  1330.                 yield s
  1331.             
  1332.         
  1333.  
  1334. LINE_END = re.compile('\\s*(#.*)?$').match
  1335. CONTINUE = re.compile('\\s*\\\\\\s*(#.*)?$').match
  1336. DISTRO = re.compile('\\s*((\\w|[-.])+)').match
  1337. VERSION = re.compile('\\s*(<=?|>=?|==|!=)\\s*((\\w|[-.])+)').match
  1338. COMMA = re.compile('\\s*,').match
  1339. OBRACKET = re.compile('\\s*\\[').match
  1340. CBRACKET = re.compile('\\s*\\]').match
  1341. MODULE = re.compile('\\w+(\\.\\w+)*$').match
  1342. EGG_NAME = re.compile('(?P<name>[^-]+)( -(?P<ver>[^-]+) (-py(?P<pyver>[^-]+) (-(?P<plat>.+))? )? )?', re.VERBOSE | re.IGNORECASE).match
  1343. component_re = re.compile('(\\d+ | [a-z]+ | \\.| -)', re.VERBOSE)
  1344. replace = {
  1345.     'pre': 'c',
  1346.     'preview': 'c',
  1347.     '-': 'final-',
  1348.     'rc': 'c',
  1349.     'dev': '@' }.get
  1350.  
  1351. def _parse_version_parts(s):
  1352.     for part in component_re.split(s):
  1353.         part = replace(part, part)
  1354.         if not part or part == '.':
  1355.             continue
  1356.         
  1357.         if part[:1] in '0123456789':
  1358.             yield part.zfill(8)
  1359.             continue
  1360.         yield '*' + part
  1361.     
  1362.     yield '*final'
  1363.  
  1364.  
  1365. def parse_version(s):
  1366.     parts = []
  1367.     for part in _parse_version_parts(s.lower()):
  1368.         if part.startswith('*'):
  1369.             if part < '*final':
  1370.                 while parts and parts[-1] == '*final-':
  1371.                     parts.pop()
  1372.             
  1373.             while parts and parts[-1] == '00000000':
  1374.                 parts.pop()
  1375.         
  1376.         parts.append(part)
  1377.     
  1378.     return tuple(parts)
  1379.  
  1380.  
  1381. class EntryPoint(object):
  1382.     
  1383.     def __init__(self, name, module_name, attrs = (), extras = (), dist = None):
  1384.         if not MODULE(module_name):
  1385.             raise ValueError('Invalid module name', module_name)
  1386.         
  1387.         self.name = name
  1388.         self.module_name = module_name
  1389.         self.attrs = tuple(attrs)
  1390.         self.extras = Requirement.parse('x[%s]' % ','.join(extras)).extras
  1391.         self.dist = dist
  1392.  
  1393.     
  1394.     def __str__(self):
  1395.         s = '%s = %s' % (self.name, self.module_name)
  1396.         if self.attrs:
  1397.             s += ':' + '.'.join(self.attrs)
  1398.         
  1399.         if self.extras:
  1400.             s += ' [%s]' % ','.join(self.extras)
  1401.         
  1402.         return s
  1403.  
  1404.     
  1405.     def __repr__(self):
  1406.         return 'EntryPoint.parse(%r)' % str(self)
  1407.  
  1408.     
  1409.     def load(self, require = True, env = None, installer = None):
  1410.         if require:
  1411.             self.require(env, installer)
  1412.         
  1413.         entry = __import__(self.module_name, globals(), globals(), [
  1414.             '__name__'])
  1415.         for attr in self.attrs:
  1416.             
  1417.             try:
  1418.                 entry = getattr(entry, attr)
  1419.             continue
  1420.             except AttributeError:
  1421.                 raise ImportError('%r has no %r attribute' % (entry, attr))
  1422.                 continue
  1423.             
  1424.  
  1425.         
  1426.         return entry
  1427.  
  1428.     
  1429.     def require(self, env = None, installer = None):
  1430.         if self.extras and not (self.dist):
  1431.             raise UnknownExtra("Can't require() without a distribution", self)
  1432.         
  1433.         map(working_set.add, working_set.resolve(self.dist.requires(self.extras), env, installer))
  1434.  
  1435.     
  1436.     def parse(cls, src, dist = None):
  1437.         
  1438.         try:
  1439.             attrs = extras = ()
  1440.             (name, value) = src.split('=', 1)
  1441.             if '[' in value:
  1442.                 (value, extras) = value.split('[', 1)
  1443.                 req = Requirement.parse('x[' + extras)
  1444.                 if req.specs:
  1445.                     raise ValueError
  1446.                 
  1447.                 extras = req.extras
  1448.             
  1449.             if ':' in value:
  1450.                 (value, attrs) = value.split(':', 1)
  1451.                 if not MODULE(attrs.rstrip()):
  1452.                     raise ValueError
  1453.                 
  1454.                 attrs = attrs.rstrip().split('.')
  1455.         except ValueError:
  1456.             raise ValueError("EntryPoint must be in 'name=module:attrs [extras]' format", src)
  1457.  
  1458.         return cls(name.strip(), value.strip(), attrs, extras, dist)
  1459.  
  1460.     parse = classmethod(parse)
  1461.     
  1462.     def parse_group(cls, group, lines, dist = None):
  1463.         if not MODULE(group):
  1464.             raise ValueError('Invalid group name', group)
  1465.         
  1466.         this = { }
  1467.         for line in yield_lines(lines):
  1468.             ep = cls.parse(line, dist)
  1469.             if ep.name in this:
  1470.                 raise ValueError('Duplicate entry point', group, ep.name)
  1471.             
  1472.             this[ep.name] = ep
  1473.         
  1474.         return this
  1475.  
  1476.     parse_group = classmethod(parse_group)
  1477.     
  1478.     def parse_map(cls, data, dist = None):
  1479.         if isinstance(data, dict):
  1480.             data = data.items()
  1481.         else:
  1482.             data = split_sections(data)
  1483.         maps = { }
  1484.         for group, lines in data:
  1485.             if group is None:
  1486.                 if not lines:
  1487.                     continue
  1488.                 
  1489.                 raise ValueError('Entry points must be listed in groups')
  1490.             
  1491.             group = group.strip()
  1492.             if group in maps:
  1493.                 raise ValueError('Duplicate group name', group)
  1494.             
  1495.             maps[group] = cls.parse_group(group, lines, dist)
  1496.         
  1497.         return maps
  1498.  
  1499.     parse_map = classmethod(parse_map)
  1500.  
  1501.  
  1502. class Distribution(object):
  1503.     
  1504.     def __init__(self, location = None, metadata = None, project_name = None, version = None, py_version = PY_MAJOR, platform = None, precedence = EGG_DIST):
  1505.         if not project_name:
  1506.             pass
  1507.         self.project_name = safe_name('Unknown')
  1508.         if version is not None:
  1509.             self._version = safe_version(version)
  1510.         
  1511.         self.py_version = py_version
  1512.         self.platform = platform
  1513.         self.location = location
  1514.         self.precedence = precedence
  1515.         if not metadata:
  1516.             pass
  1517.         self._provider = empty_provider
  1518.  
  1519.     
  1520.     def from_location(cls, location, basename, metadata = None, **kw):
  1521.         (project_name, version, py_version, platform) = [
  1522.             None] * 4
  1523.         (basename, ext) = os.path.splitext(basename)
  1524.         if ext.lower() in ('.egg', '.egg-info'):
  1525.             match = EGG_NAME(basename)
  1526.             if match:
  1527.                 (project_name, version, py_version, platform) = match.group('name', 'ver', 'pyver', 'plat')
  1528.             
  1529.         
  1530.         return cls(location, metadata, project_name = project_name, version = version, py_version = py_version, platform = platform, **kw)
  1531.  
  1532.     from_location = classmethod(from_location)
  1533.     hashcmp = property((lambda self: if not self.location:
  1534. pass(getattr(self, 'parsed_version', ()), self.precedence, self.key, -len(''), self.location, self.py_version, self.platform)))
  1535.     
  1536.     def __cmp__(self, other):
  1537.         return cmp(self.hashcmp, other)
  1538.  
  1539.     
  1540.     def __hash__(self):
  1541.         return hash(self.hashcmp)
  1542.  
  1543.     
  1544.     def key(self):
  1545.         
  1546.         try:
  1547.             return self._key
  1548.         except AttributeError:
  1549.             self._key = key = self.project_name.lower()
  1550.             return key
  1551.  
  1552.  
  1553.     key = property(key)
  1554.     
  1555.     def parsed_version(self):
  1556.         
  1557.         try:
  1558.             return self._parsed_version
  1559.         except AttributeError:
  1560.             self._parsed_version = pv = parse_version(self.version)
  1561.             return pv
  1562.  
  1563.  
  1564.     parsed_version = property(parsed_version)
  1565.     
  1566.     def version(self):
  1567.         
  1568.         try:
  1569.             return self._version
  1570.         except AttributeError:
  1571.             for line in self._get_metadata('PKG-INFO'):
  1572.                 if line.lower().startswith('version:'):
  1573.                     self._version = safe_version(line.split(':', 1)[1].strip())
  1574.                     return self._version
  1575.                     continue
  1576.             else:
  1577.                 raise ValueError("Missing 'Version:' header and/or PKG-INFO file", self)
  1578.  
  1579.  
  1580.     version = property(version)
  1581.     
  1582.     def _dep_map(self):
  1583.         
  1584.         try:
  1585.             return self._Distribution__dep_map
  1586.         except AttributeError:
  1587.             dm = self._Distribution__dep_map = {
  1588.                 None: [] }
  1589.             for name in ('requires.txt', 'depends.txt'):
  1590.                 for extra, reqs in split_sections(self._get_metadata(name)):
  1591.                     if extra:
  1592.                         extra = safe_extra(extra)
  1593.                     
  1594.                     dm.setdefault(extra, []).extend(parse_requirements(reqs))
  1595.                 
  1596.             
  1597.             return dm
  1598.  
  1599.  
  1600.     _dep_map = property(_dep_map)
  1601.     
  1602.     def requires(self, extras = ()):
  1603.         dm = self._dep_map
  1604.         deps = []
  1605.         deps.extend(dm.get(None, ()))
  1606.         for ext in extras:
  1607.             
  1608.             try:
  1609.                 deps.extend(dm[safe_extra(ext)])
  1610.             continue
  1611.             except KeyError:
  1612.                 raise UnknownExtra('%s has no such extra feature %r' % (self, ext))
  1613.                 continue
  1614.             
  1615.  
  1616.         
  1617.         return deps
  1618.  
  1619.     
  1620.     def _get_metadata(self, name):
  1621.         if self.has_metadata(name):
  1622.             for line in self.get_metadata_lines(name):
  1623.                 yield line
  1624.             
  1625.         
  1626.  
  1627.     
  1628.     def activate(self, path = None):
  1629.         if path is None:
  1630.             path = sys.path
  1631.         
  1632.         self.insert_on(path)
  1633.         if path is sys.path:
  1634.             fixup_namespace_packages(self.location)
  1635.             for pkg in self._get_metadata('namespace_packages.txt'):
  1636.                 if pkg in sys.modules:
  1637.                     declare_namespace(pkg)
  1638.                     continue
  1639.             
  1640.         
  1641.  
  1642.     
  1643.     def egg_name(self):
  1644.         if not self.py_version:
  1645.             pass
  1646.         filename = '%s-%s-py%s' % (to_filename(self.project_name), to_filename(self.version), PY_MAJOR)
  1647.         if self.platform:
  1648.             filename += '-' + self.platform
  1649.         
  1650.         return filename
  1651.  
  1652.     
  1653.     def __repr__(self):
  1654.         if self.location:
  1655.             return '%s (%s)' % (self, self.location)
  1656.         else:
  1657.             return str(self)
  1658.  
  1659.     
  1660.     def __str__(self):
  1661.         
  1662.         try:
  1663.             version = getattr(self, 'version', None)
  1664.         except ValueError:
  1665.             version = None
  1666.  
  1667.         if not version:
  1668.             pass
  1669.         version = '[unknown version]'
  1670.         return '%s %s' % (self.project_name, version)
  1671.  
  1672.     
  1673.     def __getattr__(self, attr):
  1674.         if attr.startswith('_'):
  1675.             raise AttributeError, attr
  1676.         
  1677.         return getattr(self._provider, attr)
  1678.  
  1679.     
  1680.     def from_filename(cls, filename, metadata = None, **kw):
  1681.         return cls.from_location(_normalize_cached(filename), os.path.basename(filename), metadata, **kw)
  1682.  
  1683.     from_filename = classmethod(from_filename)
  1684.     
  1685.     def as_requirement(self):
  1686.         return Requirement.parse('%s==%s' % (self.project_name, self.version))
  1687.  
  1688.     
  1689.     def load_entry_point(self, group, name):
  1690.         ep = self.get_entry_info(group, name)
  1691.         if ep is None:
  1692.             raise ImportError('Entry point %r not found' % ((group, name),))
  1693.         
  1694.         return ep.load()
  1695.  
  1696.     
  1697.     def get_entry_map(self, group = None):
  1698.         
  1699.         try:
  1700.             ep_map = self._ep_map
  1701.         except AttributeError:
  1702.             ep_map = self._ep_map = EntryPoint.parse_map(self._get_metadata('entry_points.txt'), self)
  1703.  
  1704.         if group is not None:
  1705.             return ep_map.get(group, { })
  1706.         
  1707.         return ep_map
  1708.  
  1709.     
  1710.     def get_entry_info(self, group, name):
  1711.         return self.get_entry_map(group).get(name)
  1712.  
  1713.     
  1714.     def insert_on(self, path, loc = None):
  1715.         if not loc:
  1716.             pass
  1717.         loc = self.location
  1718.         if not loc:
  1719.             return None
  1720.         
  1721.         if path is sys.path:
  1722.             self.check_version_conflict()
  1723.         
  1724.         nloc = _normalize_cached(loc)
  1725.         bdir = os.path.dirname(nloc)
  1726.         npath = map(_normalize_cached, path)
  1727.         bp = None
  1728.         for p, item in enumerate(npath):
  1729.             if item == nloc:
  1730.                 break
  1731.                 continue
  1732.             if item == bdir and self.precedence == EGG_DIST:
  1733.                 path.insert(p, loc)
  1734.                 npath.insert(p, nloc)
  1735.                 break
  1736.                 continue
  1737.         else:
  1738.             return None
  1739.         while None:
  1740.             
  1741.             try:
  1742.                 np = npath.index(nloc, p + 1)
  1743.             except ValueError:
  1744.                 break
  1745.                 continue
  1746.  
  1747.             del npath[np]
  1748.             del path[np]
  1749.             p = np
  1750.             continue
  1751.             return None
  1752.  
  1753.     
  1754.     def check_version_conflict(self):
  1755.         if self.key == 'setuptools':
  1756.             return None
  1757.         
  1758.         nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
  1759.         loc = normalize_path(self.location)
  1760.         for modname in self._get_metadata('top_level.txt'):
  1761.             if modname not in sys.modules and modname in nsp or modname in _namespace_packages:
  1762.                 continue
  1763.             
  1764.             fn = getattr(sys.modules[modname], '__file__', None)
  1765.             if fn and normalize_path(fn).startswith(loc):
  1766.                 continue
  1767.             
  1768.             issue_warning('Module %s was already imported from %s, but %s is being added to sys.path' % (modname, fn, self.location))
  1769.         
  1770.  
  1771.     
  1772.     def has_version(self):
  1773.         
  1774.         try:
  1775.             self.version
  1776.         except ValueError:
  1777.             issue_warning('Unbuilt egg for ' + repr(self))
  1778.             return False
  1779.  
  1780.         return True
  1781.  
  1782.     
  1783.     def clone(self, **kw):
  1784.         for attr in ('project_name', 'version', 'py_version', 'platform', 'location', 'precedence'):
  1785.             kw.setdefault(attr, getattr(self, attr, None))
  1786.         
  1787.         kw.setdefault('metadata', self._provider)
  1788.         return self.__class__(**kw)
  1789.  
  1790.     
  1791.     def extras(self):
  1792.         return _[1]
  1793.  
  1794.     extras = property(extras)
  1795.  
  1796.  
  1797. def issue_warning(*args, **kw):
  1798.     level = 1
  1799.     g = globals()
  1800.     
  1801.     try:
  1802.         while sys._getframe(level).f_globals is g:
  1803.             level += 1
  1804.     except ValueError:
  1805.         pass
  1806.  
  1807.     warn = warn
  1808.     import warnings
  1809.     warn(stacklevel = level + 1, *args, **kw)
  1810.  
  1811.  
  1812. def parse_requirements(strs):
  1813.     lines = iter(yield_lines(strs))
  1814.     
  1815.     def scan_list(ITEM, TERMINATOR, line, p, groups, item_name):
  1816.         items = []
  1817.         while not TERMINATOR(line, p):
  1818.             if CONTINUE(line, p):
  1819.                 
  1820.                 try:
  1821.                     line = lines.next()
  1822.                     p = 0
  1823.                 except StopIteration:
  1824.                     raise ValueError('\\ must not appear on the last nonblank line')
  1825.                 except:
  1826.                     None<EXCEPTION MATCH>StopIteration
  1827.                 
  1828.  
  1829.             None<EXCEPTION MATCH>StopIteration
  1830.             match = ITEM(line, p)
  1831.             if not match:
  1832.                 raise ValueError('Expected ' + item_name + ' in', line, 'at', line[p:])
  1833.             
  1834.             items.append(match.group(*groups))
  1835.             p = match.end()
  1836.             match = COMMA(line, p)
  1837.             if match:
  1838.                 p = match.end()
  1839.                 continue
  1840.             if not TERMINATOR(line, p):
  1841.                 raise ValueError("Expected ',' or end-of-list in", line, 'at', line[p:])
  1842.                 continue
  1843.         match = TERMINATOR(line, p)
  1844.         if match:
  1845.             p = match.end()
  1846.         
  1847.         return (line, p, items)
  1848.  
  1849.     for line in lines:
  1850.         match = DISTRO(line)
  1851.         if not match:
  1852.             raise ValueError('Missing distribution spec', line)
  1853.         
  1854.         project_name = match.group(1)
  1855.         p = match.end()
  1856.         extras = []
  1857.         match = OBRACKET(line, p)
  1858.         if match:
  1859.             p = match.end()
  1860.             (line, p, extras) = scan_list(DISTRO, CBRACKET, line, p, (1,), "'extra' name")
  1861.         
  1862.         (line, p, specs) = scan_list(VERSION, LINE_END, line, p, (1, 2), 'version spec')
  1863.         specs = [ (op, safe_version(val)) for op, val in specs ]
  1864.         yield Requirement(project_name, specs, extras)
  1865.         []
  1866.     
  1867.  
  1868.  
  1869. def _sort_dists(dists):
  1870.     tmp = [ (dist.hashcmp, dist) for dist in dists ]
  1871.     tmp.sort()
  1872.     dists[::-1] = [ d for hc, d in tmp ]
  1873.  
  1874.  
  1875. class Requirement:
  1876.     
  1877.     def __init__(self, project_name, specs, extras):
  1878.         self.unsafe_name = project_name
  1879.         project_name = safe_name(project_name)
  1880.         self.project_name = project_name
  1881.         self.key = project_name.lower()
  1882.         index = [ (parse_version(v), state_machine[op], op, v) for op, v in specs ]
  1883.         index.sort()
  1884.         self.specs = [ (op, ver) for parsed, trans, op, ver in index ]
  1885.         self.index = index
  1886.         self.extras = tuple(map(safe_extra, extras))
  1887.         self.hashCmp = ([], []([ (op, parsed) for parsed, trans, op, ver in index ]), frozenset(self.extras))
  1888.         self._Requirement__hash = hash(self.hashCmp)
  1889.  
  1890.     
  1891.     def __str__(self):
  1892.         specs = []([ ''.join(s) for s in self.specs ])
  1893.         extras = ','.join(self.extras)
  1894.         return '%s%s%s' % (self.project_name, extras, specs)
  1895.  
  1896.     
  1897.     def __eq__(self, other):
  1898.         if isinstance(other, Requirement):
  1899.             pass
  1900.         return self.hashCmp == other.hashCmp
  1901.  
  1902.     
  1903.     def __contains__(self, item):
  1904.         if isinstance(item, Distribution):
  1905.             if item.key != self.key:
  1906.                 return False
  1907.             
  1908.             if self.index:
  1909.                 item = item.parsed_version
  1910.             
  1911.         elif isinstance(item, basestring):
  1912.             item = parse_version(item)
  1913.         
  1914.         last = None
  1915.         for parsed, trans, op, ver in self.index:
  1916.             action = trans[cmp(item, parsed)]
  1917.             if action == 'F':
  1918.                 return False
  1919.                 continue
  1920.             if action == 'T':
  1921.                 return True
  1922.                 continue
  1923.             if action == '+':
  1924.                 last = True
  1925.                 continue
  1926.             if action == '-' or last is None:
  1927.                 last = False
  1928.                 continue
  1929.         
  1930.         if last is None:
  1931.             last = True
  1932.         
  1933.         return last
  1934.  
  1935.     
  1936.     def __hash__(self):
  1937.         return self._Requirement__hash
  1938.  
  1939.     
  1940.     def __repr__(self):
  1941.         return 'Requirement.parse(%r)' % str(self)
  1942.  
  1943.     
  1944.     def parse(s):
  1945.         reqs = list(parse_requirements(s))
  1946.         if reqs:
  1947.             if len(reqs) == 1:
  1948.                 return reqs[0]
  1949.             
  1950.             raise ValueError('Expected only one requirement', s)
  1951.         
  1952.         raise ValueError('No requirements found', s)
  1953.  
  1954.     parse = staticmethod(parse)
  1955.  
  1956. state_machine = {
  1957.     '<': '--T',
  1958.     '<=': 'T-T',
  1959.     '>': 'F+F',
  1960.     '>=': 'T+F',
  1961.     '==': 'T..',
  1962.     '!=': 'F++' }
  1963.  
  1964. def _get_mro(cls):
  1965.     if not isinstance(cls, type):
  1966.         
  1967.         class cls(cls, object):
  1968.             pass
  1969.  
  1970.         return cls.__mro__[1:]
  1971.     
  1972.     return cls.__mro__
  1973.  
  1974.  
  1975. def _find_adapter(registry, ob):
  1976.     for t in _get_mro(getattr(ob, '__class__', type(ob))):
  1977.         if t in registry:
  1978.             return registry[t]
  1979.             continue
  1980.     
  1981.  
  1982.  
  1983. def ensure_directory(path):
  1984.     dirname = os.path.dirname(path)
  1985.     if not os.path.isdir(dirname):
  1986.         os.makedirs(dirname)
  1987.     
  1988.  
  1989.  
  1990. def split_sections(s):
  1991.     section = None
  1992.     content = []
  1993.     for line in yield_lines(s):
  1994.         if line.startswith('['):
  1995.             if line.endswith(']'):
  1996.                 if section or content:
  1997.                     yield (section, content)
  1998.                 
  1999.                 section = line[1:-1].strip()
  2000.                 content = []
  2001.             else:
  2002.                 raise ValueError('Invalid section heading', line)
  2003.         line.endswith(']')
  2004.         content.append(line)
  2005.     
  2006.     yield (section, content)
  2007.  
  2008.  
  2009. def _mkstemp(*args, **kw):
  2010.     mkstemp = mkstemp
  2011.     import tempfile
  2012.     old_open = os.open
  2013.     
  2014.     try:
  2015.         os.open = os_open
  2016.         return mkstemp(*args, **kw)
  2017.     finally:
  2018.         os.open = old_open
  2019.  
  2020.  
  2021. _manager = ResourceManager()
  2022.  
  2023. def _initialize(g):
  2024.     for name in dir(_manager):
  2025.         if not name.startswith('_'):
  2026.             g[name] = getattr(_manager, name)
  2027.             continue
  2028.     
  2029.  
  2030. _initialize(globals())
  2031. working_set = WorkingSet()
  2032.  
  2033. try:
  2034.     from __main__ import __requires__
  2035. except ImportError:
  2036.     pass
  2037.  
  2038.  
  2039. try:
  2040.     working_set.require(__requires__)
  2041. except VersionConflict:
  2042.     working_set = WorkingSet([])
  2043.     for dist in working_set.resolve(parse_requirements(__requires__), Environment()):
  2044.         working_set.add(dist)
  2045.     
  2046.     for entry in sys.path:
  2047.         if entry not in working_set.entries:
  2048.             working_set.add_entry(entry)
  2049.         
  2050.     
  2051.     sys.path[:] = working_set.entries
  2052.  
  2053. require = working_set.require
  2054. iter_entry_points = working_set.iter_entry_points
  2055. add_activation_listener = working_set.subscribe
  2056. run_script = working_set.run_script
  2057. run_main = run_script
  2058. add_activation_listener((lambda dist: dist.activate()))
  2059. working_set.entries = []
  2060. map(working_set.add_entry, sys.path)
  2061.